強大更勝 vundle 的 el-get 介紹之上篇。
本篇要介紹複雜許多,功能也強大很多的el-get: [上篇]
el-get.el是相對於package.el的另一個套件。與package不同的是,他沒有一個集中的套件管理中心,而是讓使用者自行從svn、git、hg、Google-code、emacswiki,當然還有剛剛提到的各elpa庫裏面安裝套件。
首先透過網路執行安裝 elisp 程式(其實有點安全性上的問題?因為 emacs 其實可以更動你所有 home 下面的檔案)
將安裝代碼貼到 *scrath* 按下 C-x C-e 讓他執行
(url-retrieve
"https://raw.github.com/dimitri/el-get/master/el-get-install.el"
(lambda (s)
(let (el-get-master-branch)
(goto-char (point-max))
(eval-print-last-sexp))))
在.emacs.d中,就會建立起一個el-get的資料夾。裏面包含了el-get的主程式以及使用者選定安裝的套件。必須在 init.el 或 .emacs 中宣告el-get所在資料夾的位置,才不會導致require錯誤!(底下所付,為一安全防護措施,稍候解釋,關鍵是add-to-list那句話一定要出現,不然會導致錯誤)
el-get 載入代碼:(放置於 init.el 開頭)
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil t)
(url-retrieve
"https://github.com/dimitri/el-get/raw/master/el-get-install.el"
(lambda (s) (end-of-buffer) (eval-print-last-sexp))))
經過此番步驟,el-get 的環境已經基本建立起來了。接下來說明一點 el-get 的特色:
注意,是el-get-sources,複數的,我搞了很久才注意到這個重點!難怪怎麼都沒辦法自動同步,原來就是這個原因阿!
另外,這個setq只是自訂「使用者自己的recipe」,真正執行安裝包的不是這個動作。
「食譜」代碼編寫:
(setq
el-get-sources
'(el-get
(:name smex
:after (progn ;; 這邊就是對套件進行載入後設定,以及撰寫 recipe
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)))
(:name magit
:after (global-set-key (kbd "C-x C-z") 'magit-status))))
;; 設定要安裝的包!這裡是重點,下面解釋:
(setq packages
(append
'(el-get smex magit
paredit python-mode web-mode go-mode)
(mapcar 'el-get-source-name el-get-sources)))
;; 這裡是設定重點,包含異步/同步啟動機制
(el-get 'sync packages)
必須在這邊指定要安裝哪些包。上面的 el-get-source 只是使用者自訂recipe而已。官方提供的 recipe 可以到 /.emacs.d/el-get/el-get/recipe 裏面看。
這邊是初始化代碼,裏面可以有來自各種官方來源的包,也可以是使用者自行設定的包,也就是所謂的 recipe,請看下面 Recipe 代碼例子
Recipe代碼:
(:name el-get
:type git
:url "git://github.com/dimitri/el-get.git"
:features el-get
:compile "el-get.el")
可以指定特殊來源(只有 git 內建支援,其他參見 emacswiki)。使用者本身設定完之後,接著即進行載入的動作(el-get)。需要注意的是,如果套件之間有互相依賴的關係,先載入依賴方,可能就會導致過程錯誤,使 emacs 的載入過程停頓。所以若套件之間有相互依賴的關係,需要把被依賴的套件放在文件前端,然後使用異步載入指令(el-git ‘sync)來達成相依性的問題。
另外,通過執行 M-x el-get-emacswiki-refresh,可以獲得來自emacswiki上面的套件列表,再透過el-get-install安裝這些套件。(因此你不能把來自 emacswiki 的 el 寫在前面的初始化設定內,除非你在更前面放了 wiki-refresh 的命令,但此命令卻會讓你每次啟動都會 refresh 一次。)
el-get 最為人所稱到的是,假如你在一台全新的電腦上面貼上你的 init.el/.emacs,卻沒有安裝這些套件,el-get 會根據你的設定以及 recipe,去抓取正確、最新的套件到資料夾中,免去了要重新安裝的煩惱。這也是我前面那邊說,安裝代碼需要有個安全防護措施的原因:要先安裝 el-get,才有之後的步驟呀!